package com.heima.se.sjms.代理;

/*
    代理模式   -- 装饰者模式
       作用：可以在不修改一个类的代码前提下，对类的功能进行增强。

    实现方式：
        1. jdk动态代理： Proxy.newProxyInstance()
        2. cjlib动态代理：Enhancer实现

    区别：jdk实现依赖接口：原始对象和代理对象是平级关系，相当于两个徒弟拜了同一个师傅
          cjlib不依赖接口：原始对象是代理对象的父级，上下级关系。相当于代理对象继承自原始对象，基于方法重写实现功能增强。
 */

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

public class Demo1 {
    public static void main(String[] args) {
        //原始对象
        ArrayList<String> list = new ArrayList<>();

        //需求： 在不改变List源码的基础上，对List的add功能进行增强
        //增强效果：只添加长度 > 5的字符串，对于长度小于5忽略添加
        //基于cjlib动态代理实现
        //代理对象
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(list.getClass());
        enhancer.setCallback(new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] args) throws Throwable {
                //对add的功能进行增强
                if ("add".equals(method.getName())) {
                    String arg = (String) args[0];
                    if (arg.length() <= 5) {
                        return false;
                    }

                }
                //其他功能不做干预，直接调用原始对象功能
                return method.invoke(list, args);
            }
        });
        ArrayList proxyList = (ArrayList) enhancer.create();


        proxyList.add("12345");
        proxyList.add("123456789");
        proxyList.add("12345678910");

        System.out.println("list = " + list);

    }
}
